const express = require('express');
var multer = require('multer');
var fs=require('fs');
var path = require('path');
var app = express();
var fse = require('fs-extra');


// 用于检测是否存在用于存放文件的路径，不存在则创建路径
const createFolder = function(folder){
    try{
        fs.accessSync(folder);
    }catch(e){
        fs.mkdirSync(folder);
    }
};
// 文件上传的路径
var uploadFolder = './uploads/';
createFolder(uploadFolder);

// 用于传给multer进行复杂的文件上传配置
var storage = multer.diskStorage({
    destination: function(req,file,cb){
        // 用于进行复杂的路径配置，此处考虑分片上传，先将分片文件保存在临时目录中
        let [fname,index,fext] = file.originalname.split(".");
        let chunkDir = `${uploadFolder}/${fname}`;
        if(!fse.existsSync(chunkDir)){
            fse.mkdirsSync(chunkDir);
        }
        cb(null,chunkDir); //内部提供的回调函数 
    },
    filename: function(req,file,cb){
        // 根据上传的文件名，按分片顺序用分片索引命名，
        // 由于是分片文件，请不要加扩展名，在最后文件合并的时候再添加扩展名
        let fname = file.originalname;
        cb(null,fname.split('.')[1]);

    }
})

var upload = multer({storage: storage});// multer实例

// 配置模板引擎
app.engine('html',require('express-art-template'))
app.set('views',__dirname+'/views')

// 静态资源路由
app.use('/node_modules',express.static('node_modules'))
app.use('/upload',express.static('uploads'))

// 主页路由
app.get('/',function(req,res){
    res.render('index.html')
})

// 上传路由
app.post('/upload',upload.single('file'),function(req,res,next){
    res.end("ok");
})

// 文件合并路由
app.post('/merge',upload.none(),function(req,res){
    let name = req.body.name;
    let fname = name.split('.')[0];
    let chunkDir = path.join(uploadFolder,fname);

    let chunks = fs.readdirSync(chunkDir); // 同步读取以防文件合并顺序混乱

    chunks.sort((a,b)=>a-b).map(chunkPath=>{
        fs.appendFileSync(
            path.join(uploadFolder,name),
            fs.readFileSync(`${chunkDir}/${chunkPath}`)
        )
    })

    fse.removeSync(chunkDir);
    res.send({msg:'合并成功',url:`http://localhost:8080/upload/${name}`});
})




app.listen(8080,()=>{
    console.log("success.....localhost:8080")
})